home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ADA Programming Guide
/
ADA Programming Guide.iso
/
ada_gwu
/
pars.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-30
|
11KB
|
375 lines
/*
GWAda Development Environment for 386/486 PCs
Copyright (C) 1993, Arthur Vargas Lopes & Michael Bliss Feldman
vlopes@vortex.ufrgs.br mfeldman@seas.gwu.edu
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* Pars.c */
#include <externs.h>
static avl_cur_par = 0;
void AVL_SET_MONITOR()
{
AVL_WIN_PTR hw, hw2;
short h, co;
char opts[6];
char msg[80];
int ch;
char old;
old = avl_monitor_on;
hw2 = AVL_MAKE_WINDOW("",18,7,21,77,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Set the Parallel Monitoring On/Off:\n");
_outtext(" ESC-Cancel ENTER-Ok Type the digit to set/reset the option.");
_settextposition(2,2);
co = _settextcolor(avl_men_ready);
_outtext("ESC");
_settextposition(2,14);
_outtext("ENTER");
_settextcolor(co);
hw = AVL_MAKE_WINDOW(" Monitoring ",5,2,7,79,avl_wnd_bk_color,avl_wnd_color);
_outtext(" 1. Off Source line monitoring");
_settextcursor(0x2000);
while ( 1 ) {
_settextposition(1,5);
if (avl_monitor_on) {
_settextcolor(avl_men_ready);
_outtext("On ");
}
else {
_settextcolor(avl_men_letter);
_outtext("Off");
}
ch = getch();
if (ch == '1') {
h = ch - '1';
avl_monitor_on = !avl_monitor_on;
}
else if (ch == 27) {avl_monitor_on = old; break; }
else if (ch == 13)
break;
else if (ch == 0) ch = getch();
}
AVL_DEL_WINDOW(hw);
AVL_DEL_WINDOW(hw2);
}
void AVL_SET_TRACE()
{
AVL_WIN_PTR hw, hw2;
short h, co;
char opts[6];
char msg[80];
int ch;
hw2 = AVL_MAKE_WINDOW("",18,9,21,78,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Specify the kind of trace requested for the program's execution:\n");
_outtext(" ESC-Cancel ENTER-Ok Type the digit to set/reset an option.");
_settextposition(2,2);
co = _settextcolor(avl_men_ready);
_outtext("ESC");
_settextposition(2,16);
_outtext("ENTER");
_settextcolor(co);
hw = AVL_MAKE_WINDOW(" Trace ",5,2,13,79,avl_wnd_bk_color,avl_wnd_color);
_outtext(" 1. Off Display the source line numbers.\n");
_outtext(" There is no need to recompile the program.\n");
_outtext(" 2. Off Display the name of each routine as it is entered and exited.\n");
_outtext(" 3. Off Display the name of each exception as it is raised.\n");
_outtext(" 4. Off Trace each rendezvous.\n");
_outtext(" 5. Off Display the context-switches between tasks.\n");
_outtext(" 6. Off Display task creation, activation, and termination.");
for(h = 0; h < 6; ++h)
opts[h] = avl_trace_opts[h];
_settextcursor(0x2000);
while ( 1 ) {
_settextposition(1,5);
if (opts[0]) {
_settextcolor(avl_men_ready);
_outtext("On ");
}
else {
_settextcolor(avl_men_letter);
_outtext("Off");
}
_settextposition(3,5);
if (opts[1]) {
_settextcolor(avl_men_ready);
_outtext("On ");
}
else {
_settextcolor(avl_men_letter);
_outtext("Off");
}
_settextposition(4,5);
if (opts[2]) {
_settextcolor(avl_men_ready);
_outtext("On ");
}
else {
_settextcolor(avl_men_letter);
_outtext("Off");
}
_settextposition(5,5);
if (opts[3]) {
_settextcolor(avl_men_ready);
_outtext("On ");
}
else {
_settextcolor(avl_men_letter);
_outtext("Off");
}
_settextposition(6,5);
if (opts[4]) {
_settextcolor(avl_men_ready);
_outtext("On ");
}
else {
_settextcolor(avl_men_letter);
_outtext("Off");
}
_settextposition(7,5);
if (opts[5]) {
_settextcolor(avl_men_ready);
_outtext("On ");
}
else {
_settextcolor(avl_men_letter);
_outtext("Off");
}
ch = getch();
if (ch >= '1' && ch <= '6') {
h = ch - '1';
opts[h] = !opts[h];
}
else if (ch == 27) break;
else if (ch == 13) {
for(h = 0; h < 6; ++h)
avl_trace_opts[h] = opts[h];
break;
}
}
AVL_DEL_WINDOW(hw);
AVL_DEL_WINDOW(hw2);
/* -t [acerst] */
}
void AVL_SET_SCHEDULER()
{
AVL_WIN_PTR hw, hw2;
short h;
char msg[80];
hw2 = AVL_MAKE_WINDOW("",18,3,24,77,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Invoke a 'round-robin' scheduling policy instead of the 'run-until-\n");
_outtext(" -block' default scheduling policy and specify the maximum number of\n");
_outtext(" interpreted statements that a given task can execute before switching\n");
_outtext(" to another task. (the minimum value is 1).\n");
_outtext(" A value 0 sets the 'run-until-block' schedulling policy.");
hw = AVL_MAKE_WINDOW(" Scheduller ",13,20,13+2
,63,avl_wnd_bk_color,avl_wnd_color);
while ( 1 ) {
sprintf(msg,"%d", avl_scheduller);
if (AVL_PROMPT(1,3,msg,3)) break;
if (strlen(msg) > 0) {
h = atoi(msg);
if (h < 0) AVL_ERROR("Invalid number of interpreted statements.");
else {
avl_scheduller = h;
break;
}
}
}
AVL_DEL_WINDOW(hw);
AVL_DEL_WINDOW(hw2);
/* -r number_of_statements (an integer)*/
}
void AVL_SET_TASK_STACK()
{
AVL_WIN_PTR hw, hw2;
short h;
char msg[80];
hw2 = AVL_MAKE_WINDOW("",18,3,24,76,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Specifies the size in bytes of the stack size for each new task.\n");
_outtext(" The default is 2048. Argument values in the range 1..31 are multiplied\n");
_outtext(" by 1024 to obtain the stack size in bytes. Use of small stack sizes\n");
_outtext(" may be appropriate when executing programs with many tasks, each of\n");
_outtext(" which can run with a small stack. The maximum value is 32767.");
hw = AVL_MAKE_WINDOW(" Task Stack ",13,20,13+2
,63,avl_wnd_bk_color,avl_wnd_color);
while ( 1 ) {
sprintf(msg,"%d", avl_task_stack);
if (AVL_PROMPT(1,3,msg,3)) break;
if (strlen(msg) > 0) {
h = atoi(msg);
if (h <= 0) AVL_ERROR("Invalid task stack.");
else {
avl_task_stack = h;
break;
}
}
}
AVL_DEL_WINDOW(hw);
AVL_DEL_WINDOW(hw2);
/* -s tstack */
}
void AVL_SET_HEAP_SIZE()
{
AVL_WIN_PTR hw, hw2;
short h;
char msg[80];
hw2 = AVL_MAKE_WINDOW("",18,4,24,75,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Specifies the size of the heap increment in kilowords, by which the\n");
_outtext(" heap is expanded when the elaboration of a new entity requires it.\n");
_outtext(" The heap expands to fill available memory. The default increment is\n");
_outtext(" 32. This parameter limits the size of the largest object that can be\n");
_outtext(" created in a program.");
hw = AVL_MAKE_WINDOW(" Heap Size ",13,20,13+2
,63,avl_wnd_bk_color,avl_wnd_color);
while ( 1 ) {
sprintf(msg,"%d", avl_heap);
if (AVL_PROMPT(1,3,msg,3)) break;
if (strlen(msg) > 0) {
h = atoi(msg);
if (h <= 0) AVL_ERROR("Invalid heap size.");
else {
avl_heap = h;
break;
}
}
}
AVL_DEL_WINDOW(hw);
AVL_DEL_WINDOW(hw2);
/* -h heap */
}
void AVL_SET_PGM_STACK()
{
AVL_WIN_PTR hw, hw2;
short h;
char msg[80];
hw2 = AVL_MAKE_WINDOW("",19,5,24,75,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Specifies the size in bytes of the program stack size for the main\n");
_outtext(" task. The default is 4096. Argument values in the range 1..31 are\n");
_outtext(" multiplied by 1024 to obtain the stack size in bytes. The maximum\n");
_outtext(" value is 32767. ");
hw = AVL_MAKE_WINDOW(" Program Stack ",13,20,13+2
,63,avl_wnd_bk_color,avl_wnd_color);
while ( 1 ) {
sprintf(msg,"%d", avl_pgm_stack);
if (AVL_PROMPT(1,3,msg,3)) break;
if (strlen(msg) > 0) {
h = atoi(msg);
if (h <= 0) AVL_ERROR("Invalid stack size.");
else {
avl_pgm_stack = h;
break;
}
}
}
AVL_DEL_WINDOW(hw);
AVL_DEL_WINDOW(hw2);
/* -p pstack */
}
void AVL_SET_PARAMETERS()
{
AVL_BIND_SIZE c[7];
PROC_NAME rot[7] = {AVL_SET_MONITOR
,AVL_SET_HEAP_SIZE
,AVL_SET_PGM_STACK
,AVL_SET_TASK_STACK
,AVL_SET_SCHEDULER
,AVL_SET_TRACE
,NULL};
int i;
int save_unit;
int ch, cols = 16, rows = 6;
AVL_WIN_PTR hw, hw2;
strcpy(c[0].name,"Monitoring");
strcpy(c[1].name,"Heap Size");
strcpy(c[2].name,"Program Stack");
strcpy(c[3].name,"Task Stack");
strcpy(c[4].name,"Scheduller");
strcpy(c[5].name,"Trace");
save_unit = avl_cur_unit;
avl_cur_unit = avl_cur_par;
avl_size = rows;
hw2 = AVL_MAKE_WINDOW("",15,55,15+9,55+24,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Use the arrow keys to\n");
_outtext(" go over the options.\n");
_outtext("\n");
_outtext(" Press <enter> to\n");
_outtext(" select an option or\n");
_outtext(" type the option's no.\n");
_outtext("\n");
_outtext(" Press ESC to cancel.");
hw = AVL_MAKE_WINDOW(" Parameters ",3,avl_menu[6].c,3+rows+1,avl_menu[6].c+cols+5,avl_wnd_bk_color,avl_wnd_color);
while ( 1 ) {
AVL_SHOW_UNIT(c,cols);
ch = getch();
if ((ch >= '1' && ch <= '6') || (ch == 13)) {
if (ch != 13)
avl_cur_unit += (ch - '0' - 1);
avl_cur_par = avl_cur_unit;
avl_cur_unit = save_unit;
rot[avl_cur_par]();
}
else {
if (ch == 0 || ch == 0xE0) {
ch = getch();
switch( ch ) {
case 72 : /* Up */
if (--avl_cur_unit < 0)
avl_cur_unit = avl_size - 1;
break;
case 80 : /* Down */
if (++avl_cur_unit >= avl_size)
avl_cur_unit = 0;
break;
default : putchar(7); break;
}
continue;
}
if (ch == 27) {
AVL_DEL_WINDOW(hw);
AVL_DEL_WINDOW(hw2);
avl_cur_par = avl_cur_unit;
avl_cur_unit = save_unit;
return;
}
putch(7);
continue;
}
}
}